package com.mazaiting.emotion.util

import android.annotation.SuppressLint
import android.content.Context
import android.view.KeyEvent
import android.widget.AdapterView
import android.widget.EditText
import com.mazaiting.emotion.adapter.EmotionGridViewAdapter
import com.mazaiting.log.L

/***
 *
 *
 *                                                    __----~~~~~~~~~~~------___
 *                                   .  .   ~~//====......          __--~ ~~
 *                   -.            \_|//     |||\\  ~~~~~~::::... /~
 *                ___-==_       _-~o~  \/    |||  \\            _/~~-
 *        __---~~~.==~||\=_    -_--~/_-~|-   |\\   \\        _/~
 *    _-~~     .=~    |  \\-_    '-~7  /-   /  ||    \      /
 *  .~       .~       |   \\ -_    /  /-   /   ||      \   /
 * /  ____  /         |     \\ ~-_/  /|- _/   .||       \ /
 * |~~    ~~|--~~~~--_ \     ~==-/   | \~--===~~        .\
 *          '         ~-|      /|    |-~\~~       __--~~
 *                      |-~~-_/ |    |   ~\_   _-~            /\
 *                           /  \     \__   \/~                \__
 *                       _--~ _/ | .-~~____--~-/                  ~~==.
 *                      ((->/~   '.|||' -_|    ~~-/ ,              . _||
 *                                 -_     ~\      ~~---l__i__i__i--~~_/
 *                                 _-~-__   ~)  \--______________--~~
 *                               //.-~~~-~_--~- |-------~~~~~~~~
 *                                      //.-~~~--\
 *                               神兽保佑
 *                              代码无BUG!
 * @author mazaiting
 * @date 2019-08-09
 * @description 全局条目点击事件
 */
class GlobalOnItemClickManagerUtil(context: Context) {

    companion object {
        /**
         * 实例
         */
        @SuppressLint("StaticFieldLeak")
        private var sInstance: GlobalOnItemClickManagerUtil? = null

        /**
         * 获取实例
         * @param context 上下文
         */
        fun getInstance(context: Context): GlobalOnItemClickManagerUtil {
            if (null == sInstance) {
                synchronized(GlobalOnItemClickManagerUtil::class.java) {
                    if (null == sInstance) {
                        sInstance = GlobalOnItemClickManagerUtil(context)
                    }
                }
            }
            return sInstance!!
        }

    }

    /**
     * 输入框
     */
    private var mEditText: EditText? = null

    /**
     * 上下文
     */
    private val mContext: Context = context

    /**
     * 绑定输入框
     */
    fun attachToEditText(editText: EditText) {
        this.mEditText = editText
    }

    /**
     * 获取条目点击事件
     */
    fun getOnItemClickListener(): AdapterView.OnItemClickListener =
        AdapterView.OnItemClickListener { parent, view, position, id ->
            // 获取适配器
            val itemAdapter = parent.adapter
            // 检测适配器
            if (itemAdapter is EmotionGridViewAdapter) {
                // 获取表情 GridView 适配器
                val emotionGvAdapter: EmotionGridViewAdapter = itemAdapter
                // 检测是否为删除按钮
                if (position == emotionGvAdapter.count - 1) {
                    // 如果点击了最后一个回退按钮,则调用删除键事件
                    mEditText?.dispatchKeyEvent(KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL))
                } else {
                    // 如果点击了表情,则添加到输入框中
                    val emotionName = emotionGvAdapter.getItem(position)
                    L.d("emotionName: $emotionName")
                    // 获取当前光标位置,在指定位置上添加表情图片文本
                    val curPosition = mEditText?.selectionStart
                    // 字符串
                    val sb = StringBuilder(mEditText?.text.toString())
                    // 获取表情名
                    sb.insert(curPosition!!, emotionName)

                    // 特殊文字处理,将表情等转换一下
                    mEditText?.setText(
                        SpanStringUtil.getEmotionContent(
                            mContext,
                            EmotionUtil.EMOTION_CLASSIC_TYPE,
                            mEditText!!,
                            sb.toString()
                        )
                    )

                    // 将光标设置到新增完表情的右侧
                    mEditText?.setSelection(curPosition + emotionName.length)
                }
            }
        }
}